package aes

import (
	"encoding/base64"
	"encoding/json"
	"github.com/gogf/gf/crypto/gaes"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/util/gconv"
)

/*
AES加密工具: 使用了goframe框架的gaes工具, 加密算法为: AES/CBC/PKCS5Padding
*/

var (
	key = g.Config().GetBytes("crypto.aes.key")
	iv  = g.Config().GetBytes("crypto.aes.iv")
)

// EncryptEverything 将数据转为json格式并加密, 加密后使用base64编码返回
func EncryptEverything(data interface{}) (string, error) {
	d, err := json.Marshal(data)
	if err != nil {
		return "", err
	}
	return Encrypt(d)
}

// Encrypt 对数据进行加密, 加密后使用base64编码返回
func Encrypt(data []byte) (string, error) {
	// 使用goframe的gaes工具进行加密
	encrypt, err := gaes.EncryptCBC(data, key, iv)
	if err != nil {
		return "", err
	}
	// 返回数据的base64编码
	return base64.StdEncoding.EncodeToString(encrypt), nil
}

// DecryptEverything 对base64编码后的密文进行解密, 内部使用gconv.Scan()函数将数据转换并赋值给pointer
func DecryptEverything(encrypt string, pointer interface{}) error {
	decrypt, err := Decrypt(encrypt)
	if err != nil {
		return err
	}
	return gconv.Scan(decrypt, pointer)
}

// Decrypt 对base64编码后的密文进行解密
func Decrypt(encrypt string) ([]byte, error) {
	// 将base64编码的数据进行解码
	e, err := base64.StdEncoding.DecodeString(encrypt)
	if err != nil {
		return nil, err
	}
	// 使用goframe的gaes工具进行解密
	return gaes.DecryptCBC(e, key, iv)
}
